﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Compilex.Automata;
using Compilex.BaseLibrary;

namespace Compilex.Automata
{
    public class LongestPrefixRecognizer
    {
        public DFA Automaton { get; set; }
        public LongestPrefixRecognizer(DFA automaton)
        {
            this.Automaton = automaton;
        }

        /// <summary>
        /// Retorna o tamanho máximo do prefixo da cadeia fornecida que é aceito pelo
        /// autômato. Se nenhuma cadeia for aceita, retorna -1.
        /// </summary>
        /// <param name="fullInput">A cadeia de entrada, a ser fornecida em partes ao
        /// autômato.</param>
        /// <returns>O tamanho do maior prefixo da cadeia que é aceito pelo autômato.</returns>
        public virtual int TryRecognizeLongestPrefix(String fullInput)
        {
            ThrowHelper.ThrowIfNullOrEmpty(fullInput);
            int biggestPrefixLength = -1, currentPrefixLength = 0;
            bool accepted, keepTrying;
            do
            {
                currentPrefixLength++;
                if (currentPrefixLength > fullInput.Length)
                    break;

                string input = fullInput.Substring(0, currentPrefixLength);
                accepted = Automaton.Accepts(input, out keepTrying);
                if (accepted)
                {
                    biggestPrefixLength = currentPrefixLength;
                }
            } while (accepted || keepTrying);

            return biggestPrefixLength;
        }
    }
}
